package fr.ginvest.implementation;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import fr.ginvest.entity.Administrateur;
import fr.ginvest.interfaces.AdministrateurFacadeRemote;

@Stateless
public class AdministrateurFacade implements AdministrateurFacadeRemote {

	@PersistenceContext
	protected EntityManager entityMgr;

	public AdministrateurFacade() {
	}

	//for unit test
	public AdministrateurFacade(EntityManager entityMgr) {
		this.entityMgr = entityMgr;
	}

	/**
     * @see AdministrateurFacadeRemote#deleteAdministrateur(Administrateur)
     */
    public void deleteAdministrateur(Administrateur a) {
    	entityMgr.remove(a);
    }

	/**
     * @see AdministrateurFacadeRemote#findAdministrateurById(int)
     */
    public Administrateur findAdministrateurById(int id) {
    	return entityMgr.find(Administrateur.class, id);
    }

	/**
     * @see AdministrateurFacadeRemote#addAdministrateur(Administrateur)
     */
    public Administrateur addAdministrateur(Administrateur a) {	
        entityMgr.persist(a);
		return a;
    }

	/**
     * @see AdministrateurFacadeRemote#updateAdministrateur(Administrateur)
     */
    public Administrateur updateAdministrateur(Administrateur a) {
        return entityMgr.merge(a);
    }

	@Override
	public Administrateur findAdminByLogin(Object login) {
		final String queryString = "select model from Administrateur model where model.login= :custLogin";
		Query query = entityMgr.createQuery(queryString).setParameter("custLogin", login);
		return (Administrateur) query.getSingleResult();
	}

	@Override
	public Administrateur authenticate(String login, String password) {
		if (login == null || "".equals(login))
            return null;

		Administrateur admin = this.findAdminByLogin(login);

        // Check if it's the right password
        if (admin != null){
        	if(admin.matchPassword(password)){
        		return admin;
        	} 
        }
        return null;
	}
}
